home *** CD-ROM | disk | FTP | other *** search
/ Night Owl 8 / Night Owl CD-ROM (NOPV8) (Night Owl Publisher) (1993).ISO / 047a / lex_yacc.arj / MAN.TXT < prev    next >
Text File  |  1990-01-18  |  76KB  |  1,756 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.        LEX AND YACC - COMPILER WRITER'S TOOLS FOR TURBO PASCAL
  14.                              VERSION 2.0
  15.  
  16.                             Albert Graef
  17.                             FB Mathematik
  18.                 Johannes Gutenberg-Universitaet Mainz
  19.  
  20.                           November 22, 1989
  21.  
  22.              (ASCII version of manual: January 12, 1990)
  23.  
  24.  
  25.                                ABSTRACT
  26.  
  27. We describe a reimplementation of the compiler writer's tools Lex  and
  28. Yacc for Borland's Turbo Pascal, running under MS-DOS. These  programs
  29. are useful tools for the development of compilers, lexical  analyzers,
  30. and similar applications, and are intended for experienced Turbo  Pas-
  31. cal programmers with a background in compiler design, and for  courses
  32. in compiler construction.
  33.  
  34. Note: This  is a  raw ASCII  facsimile of  the original  Lex and  Yacc
  35. manual contained in the TeX DVI file MAN.DVI on the distribution disk.
  36.  
  37. CONTENTS
  38.  
  39. Introduction
  40. 1. Installation
  41. 2. Lex
  42.    2.1 Regular Expressions
  43.    2.2 Actions
  44.    2.3 Lex Library
  45.    2.4 Character Tables
  46.    2.5 Turbo Pascal Tie-ins
  47.    2.6 Implementation Restrictions, Bugs, and Incompatibilities
  48. 3. Yacc
  49.    3.1 Actions
  50.    3.2 Lexical Analysis
  51.    3.3 Yacc Library
  52.    3.4 Ambiguity
  53.    3.5 Error Handling
  54.    3.6 Arbitrary Value Types
  55.    3.7 Debugging
  56.    3.8 Yacc Language Grammar
  57.    3.9 Additional Features, Implementation Restrictions and Bugs
  58. Conclusion
  59. References
  60. Appendix
  61.  
  62. INTRODUCTION
  63.  
  64. This manual  describes two  popular compiler  writer's tools,  Lex and
  65. Yacc, which have seen extensive use on the UNIX system, and have  been
  66. reimplemented by the author for the MS-DOS operating system.
  67.  
  68. The original (UNIX) versions of these programs are described in [2,3].
  69. Other public domain and commercial remakes of Lex and Yacc are  avail-
  70. able under MS-DOS, e.g. from DECUS and Mortice Kern Systems.  However,
  71. in difference to these implementations, the programs described in this
  72. manual are for use with Borland's Turbo Pascal, rather than with C. In
  73. particular,  they  support  Turbo  Pascal  as  their  host  and target
  74. programming language.
  75.  
  76. The Turbo Pascal Lex and Yacc versions are an independent  development
  77. of the author, not containing any fragments from the original sources,
  78. or other UNIX stuff (happily,  the theory underlying Lex and  Yacc has
  79. been published, e.g., in [1], und thus is public domain). However, the
  80. names Lex and Yacc (which, as far as I know, are not copyrighted)  are
  81. justified by the fact that the programs described here are intended to
  82. be approximately compatible with the original versions.
  83.  
  84. The intended audience for  this manual are experienced  (Turbo Pascal)
  85. programmers with knowledge of the  basics of formal language and  com-
  86. piler  theory  and  students  in  compiler  construction  courses, not
  87. novices or casual programmers. Thus, the manual is particularily  con-
  88. cise and compact, while trying to cover all essential aspects of Turbo
  89. Pascal Lex and Yacc.
  90.  
  91. As  a  supplementary  text,  we  strongly recommend the famous "dragon
  92. book"  of  Aho,  Sethi  and  Ullman  [1]  which  covers  all important
  93. theoretical and practical aspects  of compiler design and  implementa-
  94. tion.
  95.  
  96. The manual is organized as follows: Section 1 covers installation  re-
  97. quirements and the installation process. Section 2 treats the  lexical
  98. analyzer  generator  Lex;  subsections  are  devoted  to the format of
  99. regular expressions,  the implementation  of actions,  the Lex library
  100. unit, character tables, Turbo Pascal tie-ins, implementation  restric-
  101. tions, bugs,  and incompatibilities.  Section 3  discusses the  parser
  102. generator Yacc; subsections  deal with actions  in Yacc grammars,  the
  103. lexical  analyzer  routine  used  by  Yacc-generated parsers, the Yacc
  104. library unit, ambiguities in Yacc grammars, syntactic error  handling,
  105. arbitrary value types in actions, the debugging of Yacc-generated par-
  106. sers, the Yacc language syntax, and, finally, additional features, im-
  107. plementation restrictions and bugs.  The appendix contains short  des-
  108. criptions of Lex and Yacc in the style of UNIX manual pages.
  109.  
  110. Note: Throughout the manual, the terms Lex and Yacc refer to the Turbo
  111. Pascal versions. The original (UNIX) versions are denoted by the terms
  112. UNIX or standard Lex resp. Yacc.
  113.  
  114. 1. INSTALLATION
  115.  
  116. Installation requirements:
  117. - IBM PC/XT/AT or compatible, 512 KB RAM
  118. - MS-DOS 3.10 or later (may also run under MS-DOS 2.x, but I have  not
  119.   tested it)
  120. - Turbo Pascal 4.0 or later (has been tested with 4.0 and 5.0)
  121.  
  122. To install Turbo Pascal Lex and Yacc, simply copy the contents of  the
  123. distribution disk to an  appropriate disk and/or directory.  You might
  124. also  wish  to  put  this  directory  on  your  DOS path. The programs
  125. generated with  Lex and  Yacc will  need the  LexLib and YaccLib units
  126. (.tpu files on the distribution disk) when compiled, so you might have
  127. to put them  anywhere the Turbo  Pascal compiler finds  them (e.g., in
  128. the turbo.tpl library).
  129.  
  130. Here's the contents of the distribution disk:
  131. lex.exe     the Lex program
  132. lexlib.*    source and .tpu file for the LexLib unit
  133. yacc.exe    the Yacc program
  134. yacclib.*   source and .tpu file for the YaccLib unit
  135. read.me     if present, contains addenda to the manual
  136. makefile    makefile for the sample programs
  137. *.l, *.y    sample Lex and Yacc programs
  138. man.dvi     TeX dvi file for the manual
  139.  
  140. As shipped, the LexLib and YaccLib units are compiled with Turbo  Pas-
  141. cal 4.0. If you're running Turbo Pascal 5.0 or later, you will have to
  142. recompile lexlib.pas and  yacclib.pas with your  version of the  Turbo
  143. Pascal compiler.
  144.  
  145. You can use the  makefile to compile the  sample programs on the  dis-
  146. tribution disk (see the Turbo Pascal manual for a description of  Bor-
  147. land's make, and the makefile for  a description of its usage and  the
  148. sample programs).
  149.  
  150. To run Turbo Pascal Lex and Yacc on your grammar sourcefiles, refer to
  151. the manual pages in the appendix for a description of the Lex and Yacc
  152. command formats.
  153.  
  154. 2. LEX
  155.  
  156. Lex is a program to generate lexical analyzers from a given set of in-
  157. put patterns, specified as regular expressions. Table 1 summarizes the
  158. regular expressions Lex  recognizes. In this  table, c stands  for any
  159. single character, r for a regular expression, and s for a string.
  160.  
  161. Expression  Matches                        Example
  162. --------------------------------------------------
  163. c           any non-operator character c   a
  164. \c          character c literally          \*
  165. "s"         string s literally             "**"
  166. .           any character but newline      a.*b
  167. ^           beginning of line              ^abc
  168. $           end of line                    abc$
  169. [s]         any character in s             [abc]
  170. [^s]        any character not in s         [^abc]
  171. r*          zero or more r's               a*
  172. r+          one or more r's                a+
  173. r?          zero or one r                  a?
  174. r{m,n}      m to n occurrences of r        a{1,5}
  175. r1r2        r1 then r2                     ab
  176. r1|r2       r1 or r2                       a|b
  177. (r)         r                              (a|b)
  178. r1/r2       r1 when followed by r2         abc/123
  179. --------------------------------------------------
  180. Table 1: Lex regular expressions (taken from [1, fig. 3.48]).
  181.  
  182. A Lex  program, or  grammar, in  general, consists  of three  sections
  183. separated with the delimiter %%:
  184.    definitions
  185.    %%
  186.    rules
  187.    %%
  188.    auxiliary procedures
  189.  
  190. Both definitions  and rules  section may  be empty,  and the auxiliary
  191. procedures section may be omitted, together with the second %%.  Thus,
  192. the minimal Lex program is
  193.    %%
  194. (no definitions, no rules).
  195.  
  196. The rules section of a Lex  program is a table of regular  expressions
  197. and corresponding actions,  specifying patterns to  be matched in  the
  198. input, and  (Turbo Pascal)  program statements  to be  executed when a
  199. pattern has been matched:
  200.    expression        statement;
  201.    ...
  202.  
  203. Here,  expression  and  statement  are  delimited with whitespace. The
  204. statement must be a single  Turbo Pascal statement (use begin  ... end
  205. for compound statements) terminated with a semicolon; if the statement
  206. consists of multiple  lines, the continuation  lines must be  indented
  207. with  at  least  one  blank  or  tab  character. An action may also be
  208. replaced by the symbol |, in which case it is assumed that the  action
  209. for the current rule is the same as that for the next one.
  210.  
  211. As already indicated, the auxiliary procedures section is optional. If
  212. it is present, it is assumed to contain valid Turbo Pascal code  (such
  213. as supplementing routines, or a  main program) which is simply  tacked
  214. on to the end of the output (Turbo Pascal) program Lex produces.
  215.  
  216. The definitions section of a  Lex program may contain regular  defini-
  217. tions of the form
  218.    name       expression
  219. defining a  (regular expression)  substitution for  an identifier name
  220. (according  to  Turbo  Pascal  syntax).  name  and  expression must be
  221. separated by whitespace. Note that in difference to Pascal, upper- and
  222. lowercase in identifiers is always distinct.
  223.  
  224. The value of a regular definition for name can be referred to  lateron
  225. using the notation {name}. Thus, regular definitions provide a sort of
  226. "constant declaration" for regular expressions.
  227.  
  228. From the source  grammar, Lex produces  an output program,  written in
  229. Turbo Pascal, that defines a parameterless function
  230.    function yylex : integer;
  231. implementing the lexical analyzer.  When called, yylex reads  an input
  232. file (standard input, by default), scanning for the patterns specified
  233. in the source grammar, and executing the corresponding actions as pat-
  234. terns are matched.
  235.  
  236. Normally, yylex scans the whole input file and returns with value 0 to
  237. the calling  program upon  encountering end-of-file  (actions may also
  238. return other  values to  the calling  program, cf.  2.2). Thus, in the
  239. normal case, a suitable main program calling yylex is something like:
  240.    begin
  241.      if yylex=0 then { done }
  242.    end.
  243.  
  244. Such a main program must be  supplied by the programmer, e.g., in  the
  245. auxiliary procedures section (there is no default main program in  the
  246. Lex library, as with UNIX Lex).
  247.  
  248. The   lexical   analyzer   routine   yylex   scans  for  all  patterns
  249. simultaneously. If more than one pattern is matched, the longest match
  250. is preferred; if there still remains more than one pattern making  the
  251. longest match, the  first such rule  in the source  grammar is chosen.
  252. This makes rules like
  253.    if                       writeln('keyword if');
  254.    [A-Za-z][A-Za-z0-9]*     writeln('identifier ', yytext);
  255. work as expected (i.e., input if will be matched by the first, if1  by
  256. the second rule).
  257.  
  258. A Lex program  may also be  incomplete in that  it does not  specify a
  259. pattern for any possible input.  In such a case, the  lexical analyzer
  260. executes a default  action on unrecognized  parts of the  input, which
  261. consists of copying the input  to an output file (standard  output, by
  262. default). Thus, the trivial Lex program
  263.    %%
  264. yields a routine that copies  the input to the output  file unchanged.
  265. On the other  hand, if the  input has to  be absorbed completely,  the
  266. programmer must supply rules that match everything, e.g.:
  267.    .         |
  268.    \n        ;
  269.  
  270. Example: The  following Lex  program counts  words (sequences  of non-
  271. whitespace characters) in an input file:
  272.         uses LexLib;
  273.         var count : integer;
  274.    %%
  275.    [^ \t\n]+    inc(count);
  276.    .            |
  277.    \n           ;
  278.    %%
  279.    begin
  280.      count := 0;
  281.      if yylex=0 then writeln('word count: ', count)
  282.    end.
  283.  
  284. A few remarks about the generated lexical analyzer routine are in  or-
  285. der. Lex generates table-driven lexical analyzers in DFA technique [1,
  286. section 3.7]  which usually  are both  quite compact  and fast (though
  287. hand-coded  lexical  analyzers  will  often  be  more  efficient).  In
  288. particular, the matching time is proportional to the length of the in-
  289. put, unless ambiguity and  lookahead requires a significant  amount of
  290. rescanning. There are  certain pathological regular  expressions which
  291. cause exponential growth of the DFA table, however, they are rare.
  292.  
  293. Lex-generated lexical  analyzers interface  nicely with  Yacc, because
  294. the  yylex  routine  just  meets  Yacc's  requirements  of its lexical
  295. analyzer routine (actually, it was  designed that way). Thus, a  yylex
  296. routine prepared with  Lex can be  incorporated directly into  a Yacc-
  297. generated parser.
  298.  
  299. 2.1 REGULAR EXPRESSIONS
  300.  
  301. In the Lex language regular expressions are used to denote string pat-
  302. terns to be matched in the input stream. The basic regular expressions
  303. are (cf. table 1):
  304. - single characters: c stands for the literal character c itself,  un-
  305.   less it is an  operator character (one of  *, +, ?, etc.,  discussed
  306.   below), in which case it must  be quoted with the backslash \.  Non-
  307.   printable characters are specified  using the C-like escapes  listed
  308.   in table 2. Note that \0 marks end-of-file, and \n (newline)  stands
  309.   for end-of-line, i.e. the sequence carriage-return/line-feed in  MS-
  310.   DOS text files.
  311.  
  312.   Escape  Denotes
  313.   ----------------------------------
  314.   \b      backspace
  315.   \t      tab
  316.   \n      newline
  317.   \nnn    character no. nnn in octal
  318.   \\      backslash
  319.   \c      character c literally
  320.   ----------------------------------
  321.   Table 2: Lex character escapes.
  322.  
  323. - strings:  "s", where  s is  any character  sequence, stands  for the
  324.   string s. To embed the double quote " in a string, it must be quoted
  325.   with \.
  326. - character  classes: [s]  stands for  all characters  in s,  and [^s]
  327.   denotes the complement of [s]. A - sign in a character class denotes
  328.   ranges, e.g. [a-z] is the class of all lowercase letters. The period
  329.   . is an abbreviation for the class of all characters except newline,
  330.   i.e. [^\n]. Note that a  character class never contains the  end-of-
  331.   file marker \0, unless it is explicitly included.
  332.  
  333. From these basic  elements, larger regular  expressions may be  formed
  334. using the following operators:
  335. - r*: stands for an arbitrary sequence of r's (0 or more), where r  is
  336.   any regular expression.
  337. - r+: stands for 1 or more r's.
  338. - r?: stands for 0 or 1 r.
  339. - r{m,n}: stands  for m to  n r's (where  m and n  are nonnegative in-
  340.   tegers). r{m} denotes excactly m r's.
  341. - r1r2: stands for r1, followed by r2, where r1 and r2  are  arbitrary
  342.   regular expressions.
  343. - r1|r2: stands for r1 or r2.
  344.  
  345. The operators have been listed in order of decreasing precedence, i.e.
  346. *, +, ?  and {m,n} bind  stronger than r1r2  (concatenation), which in
  347. turn precedes over | (alternation). Parentheses ( ... ) can be used to
  348. group regular expressions and override default precedences.
  349.  
  350. As already  mentioned, subexpressions  may be  abbreviated with names,
  351. using regular definitions. If name  has been defined as an  expression
  352. r, {name} specifies the regular expression r. Note that (in difference
  353. to UNIX Lex)  the substituted expression  r must always  be a complete
  354. legal regular expression, which is actually substituted as an  expres-
  355. sion,  not  textually.  This  implies  that  {name}  is  treated  as a
  356. parenthesized expression. Also note, that any references to name  must
  357. follow its definition, i.e. recursive definitions are illegal.
  358.  
  359. Lex also supplies a number of operators that are used to specify  left
  360. and right context.  The context does  not actually belong  to the pat-
  361. tern, but determines whether the pattern itself may be matched.
  362.  
  363. Right context, or lookahead is specified using the lookahead  operator
  364. /. r1/r2 stands for  r1, but only if  followed by r2, where  r1 and r2
  365. are arbitrary regular expressions (which may, however, not contain the
  366. lookahead operator themselves). r$ may be used as an abbreviation  for
  367. r/[\0\n], i.e. r followed by line end or end-of-file.
  368.  
  369. The caret ^ stands for the  beginning of the line, and thus  marks im-
  370. mediate left context. More distant left context may be specified using
  371. user-defined start states. The expression <s1,...,sn>r denotes a  pat-
  372. tern  r  that  is  valid  (i.e.,  may  be matched) only if the lexical
  373. analyzer is in any of the start states s1,...,sn. This requires one or
  374. more start state declarations in the definitions section that list all
  375. used start state  identifiers (which, like  expression names, must  be
  376. legal Turbo Pascal identifiers).
  377.    %start s1 s2 ... sn
  378. and
  379.    %start s1
  380.    ...
  381.    %start sn
  382. are examples of valid start state declarations.
  383.  
  384. By default, the lexical analyzer is in the default start state,  which
  385. has number  0. Lex  also assigns  unique numbers  to all  user-defined
  386. start states, and the begin_ routine  (cf. 2.2) can be used in  an ac-
  387. tion or any other routine to  put the lexical analyzer in the  desired
  388. start state.
  389.  
  390. Start states are useful when certain patterns have to be analyzed dif-
  391. ferently, depending on some left context (such as a special  character
  392. at the beginning of the line), or when multiple lexical analyzers  are
  393. working in  concert. Note  that a  rule without  start state prefix is
  394. valid in the default start state, as well as in any user-defined start
  395. state. This may be used to factor out patterns that are to be  matched
  396. in either user-defined state.
  397.  
  398. All the  context operators  may only  appear in  rules, not in regular
  399. definitions,  and  they  may  appear  only  once.  Of  course, context
  400. operators may be combined, as in <s>^r1/r2 which denotes a pattern  r1
  401. that may only be matched if it  occurs at the beginning of a line,  is
  402. followed by an instance of r2, and if the lexical analyzer is in user-
  403. defined start state s.
  404.  
  405. 2.2 ACTIONS
  406.  
  407. A rule specifies a regular  expression pattern and an action  (a Turbo
  408. Pascal statement) to be executed when the pattern is matched. Lex sup-
  409. plies a number of variables and routines useful in the programming  of
  410. actions:
  411. - yytext: a string variable, containing the matched text.
  412. - yyleng:  the length  of yytext,  i.e. length(yytext).  Note that the
  413.   first and last character in yytext are yytext[1] and yytext[yyleng],
  414.   respectively.
  415. - yylineno: the current line  number in the input file;  useful, e.g.,
  416.   in giving diagnostics.
  417. - yymore:  appends the  next match  to the  current one (normally, the
  418.   next match will overwrite the current one).
  419. - yyless:  the  counterpart  of  yymore;  yyless(n) causes the current
  420.   match to be  restricted to the  first n characters,  and returns the
  421.   remaining characters at  the end of  the match to  be reread by  the
  422.   lexical analyzer. This supplies  a crude form of  "lookahead". Since
  423.   Lex also supports a more  general form of lookahead (cf.  2.1), this
  424.   routine is largely obsolete.
  425. - reject: rejects the current match and executes whatever was  "second
  426.   choice" after  the current  rule, adjusting  the match  accordingly.
  427.   This routine is useful when all (possibly overlapping) instances  of
  428.   patterns have  to be  detected; see  the digram  program on the dis-
  429.   tribution disk for an example.
  430. - return: return(n), n an  integer value, causes yylex to  return with
  431.   the  indicated  value.  This  routine  is  useful  when  the lexical
  432.   analyzer is used to  partition the input file  for a parser; n  will
  433.   then typically denote a token number (cf. 3.2).
  434. - begin_: begin_(s)  puts the lexical  analyzer in start  state s (cf.
  435.   2.1), where s  is either 0  (default start state)  or names a  user-
  436.   defined start state.
  437.  
  438. These, and  other Lex-supplied  variables and  routines are  also dis-
  439. cussed in  the interface  of the  LexLib unit  (file lexlib.pas on the
  440. distribution disk).
  441.  
  442. 2.3 LEX LIBRARY
  443.  
  444. The LexLib (Lex library) unit supplies the input/output routines  used
  445. by the lexical analyzer. The I/O files are implemented as Pascal  text
  446. files  yyin  and  yyout.  These  are  -  by  default - assigned to the
  447. redirectable MS-DOS standard  input/output devices. However,  the user
  448. program may also assign them to any suitable files/devices.
  449.  
  450. yylex accesses the input/output files through the following routines:
  451. - function input : char;
  452.   returns the next character from the input file.
  453. - procedure unput(c : char);
  454.   returns character c to the input buffer to be reread by a subsequent
  455.   call to input.
  456. - procedure output(c : char);
  457.   appends character c to the output file.
  458.  
  459. All references  to the  yyin/yyout files  of the  LexLib unit are made
  460. through these three  routines. Thus, a  user program may  well replace
  461. them altogether  by other  routines matching  the specifications. This
  462. makes it  possible for  the lexical  analyzer to  access arbitrary in-
  463. put/output streams, such as special devices or internal memory.
  464.  
  465. The  LexLib  I/O  routines  and  files  may  also be accessed directly
  466. through actions or the main program. However, care must be heeded  un-
  467. der certain circumstances.  In particular, direct  access to the  yyin
  468. file will bypass the buffering of unput characters and thus may  some-
  469. times not have the desired results.
  470.  
  471. The yywrap routine is a parameterless boolean function that determines
  472. whether the lexical analyzer  should perform normal wrapup  at end-of-
  473. file. If it  returns true, normal  wrapup is performed;  if it returns
  474. false,  yylex  ignores  the  end-of-file  mark  and  continues lexical
  475. analysis. The LexLib unit supplies  a default version of yywrap  which
  476. always returns true. This routine may be replaced by a customized ver-
  477. sion that  does application  dependent processing  at end-of-file.  In
  478. particular, yywrap  may arrange  for more  input and  return false  to
  479. resume lexical analysis (see the findproc program on the  distribution
  480. disk for an example).
  481.  
  482. Note that the LexLib unit must be loaded with (almost) any Lex program
  483. such  that  the  lexical  analyzer  routine  may  access I/O and other
  484. routines. To achieve this, the line
  485.    uses LexLib;
  486. should be put at the beginning of the Lex program (see section 2.5  on
  487. how to incorporate Turbo Pascal source lines into the definitions sec-
  488. tion of a Lex program).
  489.  
  490. Refer also to the LexLib interface description contained in lexlib.pas
  491. on the distribution disk for a discussion of the LexLib I/O system and
  492. other routines.
  493.  
  494. 2.4 CHARACTER TABLES
  495.  
  496. The standard character encoding supported  both by Lex and the  LexLib
  497. unit is ASCII  (to be more  precise, IBM's 8-bit  extension of ASCII).
  498. However the user may supply his own versions of input, unput and  out-
  499. put (cf.  2.3), supporting  their own  character encoding.  If such  a
  500. customized character set is used, Lex  must be told about it by  means
  501. of a character table in the definitions section of the Lex program.
  502.  
  503. This table has the format:
  504.    %T
  505.    charno.     string
  506.    ...
  507.    %T
  508.  
  509. Each line  of the  character table  lists a  character number  (in the
  510. target code)  and the  corresponding ASCII  representation(s) of  this
  511. character. The usual escapes  for non-printable characters are  recog-
  512. nized (cf. table 2).
  513.  
  514. Example: To map the lower-  and uppercase letters into  1,...,26,  the
  515. digits  0,...,9 into codes  27,...,36, and newline into  37, the  fol-
  516. lowing table may be used:
  517.  
  518.    %T
  519.    1              Aa
  520.    2              Bb
  521.    3              Cc
  522.         ...
  523.    26             Zz
  524.    27             0
  525.    28             1
  526.         ...
  527.    36             9
  528.    37             \n
  529.    %T
  530.  
  531. If a character table is used, all characters (at least those  actually
  532. used in the Lex grammar) should be in the table; all character numbers
  533. must be byte values (0..255), and no character may be mapped into  two
  534. different codes.
  535.  
  536. 2.5 TURBO PASCAL TIE-INS
  537.  
  538. Frequently, a Lex program will  not merely consist of definitions  and
  539. rules,  but  also  use  other  routines  to be loaded with the lexical
  540. analyzer. One example is a main program that calls the yylex  routine.
  541. We have already  mentioned, that such  a main program,  and other sup-
  542. plementary routines, may be placed into the auxiliary procedures  sec-
  543. tion.
  544.  
  545. For  other  target  language  (i.e.  Turbo  Pascal)  tie-ins,  the Lex
  546. language allows arbitrary code fragments to be included in the defini-
  547. tions and at the beginning of the rules section of the Lex grammar, by
  548. the following means:
  549. - Any line in the source grammar starting in column one is assumed  to
  550.   contain Lex code (definitions or rules), which is processed by Lex.
  551. - Any line indented with at least one space or tab character, and  any
  552.   sequence of lines enclosed between  %{ and %} is assumed  to contain
  553.   Turbo Pascal code, and is copied to the output file unchanged.
  554.  
  555. Code in the  definitions section is  inserted at the  beginning of the
  556. output program, at  global scope, while  code at the  beginning of the
  557. rules  section  is  inserted  as  local  declarations  into the action
  558. routine that contains the actions of all rules. Thus, an indented line
  559.    var i : integer;
  560. at the beginning of the rules section will declare an integer variable
  561. local to the action statements.
  562.  
  563. As a side-effect, these conventions allow comments to be included in a
  564. Lex program;  comments should  then follow  host language  (i.e. Turbo
  565. Pascal) syntax.
  566.  
  567. Example: A  typical setup  for a  Lex program  with necessary declara-
  568. tions, supplementary routines, and main program may look as follows:
  569.          uses LexLib;
  570.    { global declarations }
  571.    { Lex definitions }
  572.    %%
  573.    { local declarations }
  574.    { Lex rules }
  575.    %%
  576.    { supplementary routines }
  577.    begin { main program }
  578.      ...
  579.      if yylex=0 then { done };
  580.      ...
  581.    end.
  582.  
  583. 2.6 IMPLEMENTATION RESTRICTIONS, BUGS, AND INCOMPATIBILITIES
  584.  
  585. Lex poses some restrictions on the sizes of the input grammar and  in-
  586. ternal tables. Maximum table sizes are  printed out by Lex at the  end
  587. of a translation, along with  statistics about actual table space  re-
  588. quirements. An error message table overflow can also indicate that not
  589. enough main memory is available  to Lex (possibly because of  too many
  590. programs loaded into memory).
  591.  
  592. Since yytext  is implemented  as a  Turbo Pascal  string variable, the
  593. maximum size for a matched string is 255.
  594.  
  595. As implemented, the reject routine  (cf. 2.2) does not rescan  the in-
  596. put, but uses  internal state information  to determine the  next pos-
  597. sible  match.  Thus  reject  combined  with modifications of the input
  598. stream may yield unexpected results.
  599.  
  600. There is a subtle  (and, as far as  I know, undocumented) bug  in Lex,
  601. concerning certain types of lookahead patterns, that sometimes  causes
  602. lookahead not to be restored properly. E.g., when the pattern ab*/b is
  603. matched, the last b  is never returned to  the input, but instead  the
  604. whole matched sequence will be returned in yytext. This actually is  a
  605. "misfeature", and seems to be  comformant with UNIX Lex and  even with
  606. the method of Aho/Sethi/Ullman for handling the lookahead operator [1,
  607. section 3.8], which Lex' treatment of the lookahead operator is  based
  608. on.
  609.  
  610. When  called,  yylex  partially  initalizes  itself. This implies that
  611. yymore  and  reject  will  not  work  between different invokations of
  612. yylex.
  613.  
  614. As discussed  in 2.1,  Lex substitutes  expressions, not  text, when a
  615. regular definition is referred to with the {name} notation. This is in
  616. contrast with the (textual) macro  expansion scheme used in UNIX  Lex.
  617. Although the approach taken in  Turbo Pascal Lex is more  restrictive,
  618. we feel  that it  is actually  an improvement.  In particular, regular
  619. definitions can be parsed  and checked for validity  immediately, such
  620. that errors  in regular  definitions can  be detected  as soon as pos-
  621. sible. Also, the meaning of  a regular definition is guaranteed  to be
  622. independent of the context in which it is used.
  623.  
  624. Another (minor) difference  between Turbo Pascal  and UNIX Lex  in the
  625. syntax of regular definitions is that Turbo Pascal Lex requires  names
  626. for  regular  expressions  to  be  legal  (Turbo  Pascal) identifiers,
  627. whereas UNIX Lex admits arbitrary character strings as names.
  628.  
  629. 3. YACC
  630.  
  631. Yacc ("Yet Another Compiler-Compiler")  is a parser generator,  i.e. a
  632. program that translates the specification of an input language by  its
  633. BNF (Backus Naur  Form) grammar into  a parser subroutine,  written in
  634. Turbo Pascal.
  635.  
  636. Similar to Lex, a Yacc program or grammar has the form
  637.    definitions
  638.    %%
  639.    rules
  640.    %%
  641.    auxiliary procedures
  642. where the first  section contains the  definitions of the  basic input
  643. symbols (terminals, also termed tokens) of the specified language, the
  644. second section the  grammar rules for  the nonterminal symbols  of the
  645. language, and the third, and optional, section contains any additional
  646. Turbo Pascal code, such as supplementary routines and a main  program,
  647. which will be tacked on to the end of the Turbo Pascal output program.
  648.  
  649. The rules section of  a Yacc program is  simply a BNF grammar  for the
  650. target language, possibly  augmented with actions,  program statements
  651. to be executed as certain  syntactic constructs are recognized by  the
  652. parser. By  default, the  left-hand side  of the  first rule marks the
  653. start symbol of the  grammar. It is also  possible to declare a  start
  654. symbol explicitly by means of a declaration of the form
  655.    %start A
  656. in the definitions section, where A is the desired start symbol.
  657.  
  658. Grammar rules have the general format
  659.    A : b1 ... bn;
  660. where A is the left-hand side  nonterminal of the rule, and b1  ... bn
  661. is the (possibly  empty) right-hand side  sequence of nonterminal  and
  662. terminal symbols bi.
  663.  
  664. The terminating semicolon may be omitted, and several rules A : ui for
  665. the same left-hand side nonterminal A may be abbreviated as
  666.    A : u1
  667.      | u2
  668.      ...
  669.      | un
  670.  
  671. Nonterminal symbols are denoted  by identifiers (letters, followed  by
  672. digits and letters, where underscore _ and period . count as  letters,
  673. and upper- and lowercase are distinct).
  674.  
  675. Terminal symbols may either be literals (single characters enclosed in
  676. single  quotes)  or  identifiers  that  are  declared  explicitly   as
  677. terminals by a %token definition of the form
  678.    %token a1 ... an
  679.  
  680. By convention,  token identifiers  are given  in uppercase,  such that
  681. they can be distinguished easily from nonterminal symbols.
  682.  
  683. In literals, the usual C-like escapes are recognized (cf. table 3).
  684.  
  685. Escape    Denotes
  686. ------------------------------------
  687. '\n'      newline
  688. '\r'      carriage return
  689. '\''      single quote '
  690. '\\'      backslash
  691. '\t'      tab
  692. '\b'      backspace
  693. '\f'      form feed
  694. '\nnn'    character no. nnn in octal
  695. ------------------------------------
  696. Table 3: Yacc character escapes.
  697.  
  698. Grammar rules may be  augmented with actions, Turbo  Pascal statements
  699. enclosed between { ... }. Usually, actions appear at the end of rules,
  700. indicating the statements  to be executed  when an instance  of a rule
  701. has been recognized (cf. 3.1).
  702.  
  703. The Yacc language is free-format:  blanks, tabs, and newlines are  ig-
  704. nored, except when  they serve as  delimiters. Yacc language  comments
  705. have the format:
  706.    /* ... anything except */ ... */
  707.  
  708. As  with  Lex,  host  language  (i.e.  Turbo  Pascal)  tie-ins  may be
  709. specified by enclosing them in %{ ... %}. Such code fragments will  be
  710. copied unchanged,  and inserted  into the  output file  at appropriate
  711. places (code in the definitions  section at global scope, code  at the
  712. beginning of  the rules  section as  local declarations  of the action
  713. routine).
  714.  
  715. The class of grammars accepted by Yacc is LALR(1) with  disambiguating
  716. rules (cf. [1, sections 4.7  and 4.8]). Yacc can successfully  produce
  717. parsers for a large class  of formal languages, including most  modern
  718. programming languages (under UNIX, Yacc has been used to produce  par-
  719. sers for C, Fortran, APL, Pascal, Ratfor, Modula-2, and others).
  720.  
  721. From the source grammar, Yacc  produces an output file containing  the
  722. parser routine
  723.    function yyparse : integer;
  724. together  with  any  additional  Turbo  Pascal  code  supplied  by the
  725. programmer.
  726.  
  727. yyparse repeatedly calls  a lexical analyzer  routine yylex to  obtain
  728. tokens from the input file, and parses the input accordingly,  execut-
  729. ing appropriate actions as instances of grammar rules are  recognized.
  730. yyparse returns with a value of 0 (successful parse terminated at end-
  731. of-file)  or  1  (fatal  error,  such  as parse stack overflow, or un-
  732. recoverable syntax error).
  733.  
  734. Thus, a main program  that calls the parser  routine may look as  fol-
  735. lows:
  736.    begin
  737.      ...
  738.      if yyparse=0 then { done } else { error };
  739.      ...
  740.    end.
  741.  
  742. Main program  and lexical  analyzer routine  must be  supplied by  the
  743. programmer. The yylex routine can  also be prepared with Lex  and then
  744. loaded with the parser, cf. 3.2. The main program is usually  included
  745. at the end of the auxiliary procedures section.
  746.  
  747. The following is  an example of  a Yacc grammar  for simple arithmetic
  748. expressions. Note that  the symbol NUMBER  is declared as  a token ex-
  749. pected to be returned by the  lexical analyzer as a single input  sym-
  750. bol.
  751.  
  752.    %token NUMBER
  753.    %%
  754.    expr      : term
  755.              | expr '+' term
  756.              ;
  757.    term      : factor
  758.              | term '*' factor
  759.              ;
  760.    factor    : NUMBER
  761.              | '(' expr ')'
  762.              | '-' factor
  763.              ;
  764.  
  765. A Lex program implementing the lexical analyzer for this Yacc  program
  766. may look as follows:
  767.          {$I expr.h} { definition of token numbers produced by
  768.                        Yacc }
  769.    %%
  770.    [0-9]+         return(NUMBER);
  771.    .              |
  772.    \n             return(ord(yytext[1]));
  773.                     { other literals returned as their character
  774.                       codes }
  775.  
  776. 3.1 ACTIONS
  777.  
  778. As already indicated,  grammar rules may  be associated with  actions,
  779. program statements that  are executed as  rules are recognized  during
  780. the parse. Among other things,  actions may print out results,  modify
  781. internal data structures such as a symbol table, or construct a  parse
  782. tree. Actions  may also  return a  value for  the left-hand  side non-
  783. terminal, and process values  returned by previous actions  for right-
  784. hand side symbols of the rule.
  785.  
  786. For this purpose, Yacc assigns to each symbol of a rule a  correspond-
  787. ing value (of type integer, by default, but arbitrary value types  may
  788. be declared, cf. 3.6): $$ denotes the value of the left-hand side non-
  789. terminal, $i the value of  the ith right-hand side symbol.  Values are
  790. kept on a stack maintained by  the parser as the input is  parsed. The
  791. lifetime of  a value  begins when  the corresponding  syntactic entity
  792. (nonterminal or terminal) has been recognized by the parser, and  ends
  793. when the parser  reduces by an  enclosing rule, thereby  replacing the
  794. values associated with the right-hand side symbols by the value of the
  795. left-hand side nonterminal.
  796.  
  797. Nonterminals A obtain their values through assignments of the form  $$
  798. := v, where A is the  left-hand side of the corresponding rule,  and v
  799. is some value,  usually obtained by  a function applied  to the right-
  800. hand side values $i.
  801.  
  802. Terminals may also have associated values; these are set by the  lexi-
  803. cal analyzer through an assignment to the variable yylval supplied  by
  804. Yacc (cf. 3.2), as necessary.
  805.  
  806. As an example, here is an extension of the arithmetic expression gram-
  807. mar, featuring actions that evaluate  the input expression and a  rule
  808. for the new start symbol line  that is associated with an action  that
  809. prints out the obtained result.
  810.  
  811.    %token NUMBER
  812.    %%
  813.    line      : expr '\n'         { writeln($1) }
  814.              ;
  815.    expr      : term              { $$ := $1 }
  816.              | expr '+' term     { $$ := $1 + $3 }
  817.              ;
  818.    term      : factor            { $$ := $1 }
  819.              | term '*' factor   { $$ := $1 * $3 }
  820.              ;
  821.    factor    : NUMBER            { $$ := $1 }
  822.              | '(' expr ')'      { $$ := $2 }
  823.              | '-' factor        { $$ := -$2 }
  824.              ;
  825.  
  826. Note that the lexical analyzer  must set the values of  NUMBER tokens,
  827. which are referred to by $1 in the rule factor : NUMBER. One can use a
  828. Lex rule like
  829.         var code : integer;
  830.    [0-9]+         begin
  831.                     val(yytext, yylval, code);
  832.                     return(NUMBER)
  833.                   end;
  834. that applies  the Turbo  Pascal standard  procedure val  to evaluate a
  835. NUMBER token.
  836.  
  837. Actually, we could have omitted the  "copy actions" of the form $$  :=
  838. $1 in the above grammar, since this is the default action automatical-
  839. ly assumed by Yacc for any rule without explicit action.
  840.  
  841. Yacc also allows actions within rules, i.e. actions that are to be ex-
  842. ecuted before a rule has been fully parsed. A rule like
  843.    A : b { p; } c
  844. will be treated as if it was written
  845.    A : b $act c
  846.    $act : { p; }
  847. introducing  a  new  nonterminal  $act  matched to an empty right-hand
  848. side, and associated with the desired action.
  849.  
  850. In particular, the action { p; } is treated as if it was a  (nontermi-
  851. nal) grammar symbol,  and thus can also return a value accessible with
  852. the usual $i notation.  The  action  itself  may also access values of
  853. symbols (and other actions) to the left of it. Thus, the rule  A : b {
  854. p; } c is actually treated as if it consisted of three right-hand side
  855. symbols; $1 denotes the value of b, $2  the value of { p; } (set in  p
  856. by an assignment to $$) and $3 is the value of c.
  857.  
  858. Yacc's syntax-directed evaluation  scheme makes it  particularily easy
  859. to implement synthesized attributes  along the guidelines of  [1, sec-
  860. tion 5.6]. The  evaluation of inherited  attributes can often  also be
  861. simulated by making use of  marker nonterminals, see also [1].  To ac-
  862. cess marker nonterminals outside the  scope of the rule to  which they
  863. belong, Yacc also supports the  notation $i, where i<=0, indicating  a
  864. value to the left of the current rule, belonging to an enclosing  rule
  865. ($0 denotes the first symbol to the left, $-1 the second, ...).
  866.  
  867. Consider
  868.    A : b B
  869.      | b b' { $$ := $1 } B
  870.    B : c { $$ := f($0) }
  871.  
  872. The anonymous marker nonterminal implemented by the action { $$ :=  $1
  873. } assures that the value of b can always be accessed through $0 in the
  874. third rule. Note that without use of the marker nonterminal, the rela-
  875. tive position of b's value on the stack would not be predictable.
  876.  
  877. Actions within rules, and access to values in enclosing rules,  supply
  878. flexible  means  to  implement  syntax-directed  evaluation   schemes.
  879. However, care must be heeded that such actions do not give rise to un-
  880. wanted parsing conflicts caused by ambiguities (cf. 3.4).
  881.  
  882. 3.2 LEXICAL ANALYSIS
  883.  
  884. Yacc-generated parsers use a lexical analyzer routine yylex to  obtain
  885. tokens from the input file. This routine must be supplied by the user,
  886. and is assumed to return an integer value denoting a basic input  sym-
  887. bol. 0 (or negative)  denotes end-of-file, and character  literals are
  888. denoted by their character code. Usually, all other token numbers  are
  889. assigned by Yacc automatically, in  the order in which %token  defini-
  890. tions appear in  the grammar. Token  numbers may also  be assigned ex-
  891. plicitly, by a definition of the form
  892.    %token a n
  893. where a is the terminal symbol  (literal or identifier), and n is  the
  894. desired token number.
  895.  
  896. If there is a value associated with an input symbol, yylex should  as-
  897. sign this value to the variable yylval supplied by Yacc. Usually, yyl-
  898. val has type integer, but this default can be overwritten (cf. 3.6).
  899.  
  900. Declarations shared  by parser  and lexical  analyzer are  put in  the
  901. header (.h) file Yacc generates along with the (.pas) output file con-
  902. taining the parser routine. The header file declares the yylval  vari-
  903. able and lists the token numbers; each token identifier is declared as
  904. a corresponding integer constant.
  905.  
  906. The header file should thus be  included in a context where it  is ac-
  907. cessible by both  the parser and  the lexical analyzer.  For instance,
  908. one may include both header file and lexical analyzer, in that  order,
  909. in the definitions section of the grammar, by means of the Turbo  Pas-
  910. cal include directive ($I):
  911.    %{
  912.    {$I header filename }
  913.    {$I lexical analyzer }
  914.    %}
  915.  
  916. As has already been indicated, the lexical analyzer generator Lex dis-
  917. cussed in section 2 of this manual is a useful tool to produce lexical
  918. analyzers to be incorporated into Yacc-generated parsers.
  919.  
  920. 3.3 YACC LIBRARY
  921.  
  922. The Yacc library unit YaccLib contains some default declarations  used
  923. by Yacc-generated parsers. It should therefore be loaded with yyparse,
  924. which can be achieved by the uses clause
  925.    %{
  926.    uses Yacclib;
  927.    %}
  928. at the beginning  of the Yacc  program. Note that  if the program  in-
  929. cludes a lexical analyzer prepared with Lex, the LexLib unit may  also
  930. be required:
  931.    %{
  932.    uses Yacclib, LexLib;
  933.    %}
  934.  
  935. The routines implemented by the Yacc library are defaults that can  be
  936. customized for the  target application. In  particular, these are  the
  937. yymsg message printing routine and the yydebugmsg debug message print-
  938. ing routine.  The Yacc library also  declares defaults  for the value-
  939. type YYSTYPE (cf. 3.6) and  the size of the parser  stack (yymaxdepth;
  940. see also 3.9).
  941.  
  942. Refer to the interface description of the YaccLib unit for further in-
  943. formation. The interface also describes some additional variables  and
  944. routines which are not actually  implemented by the Yacc library,  but
  945. are contained in the Yacc output file. Some of these will also be men-
  946. tioned in subsequent sections.
  947.  
  948. 3.4 AMBIGUITY
  949.  
  950. If a grammar is non-LALR(1),  Yacc will detect parsing conflicts  when
  951. constructing  the  parse  table.  Such  parsing  conflicts are usually
  952. caused by inconsistencies  and ambiguities in  the grammar. Yacc  will
  953. report  the  number  of  detected  parsing  conflicts, and will try to
  954. resolve these  conflicts, using  the methods  outlined in  [1, section
  955. 4.8]. Thus, Yacc will generate a parser for any grammar, even if it is
  956. non-LALR. However, if unexpected  parsing conflicts arise, it  is wise
  957. to consult the  parser description (.lst  file, cf. 3.7)  generated by
  958. Yacc  to  determine  whether  the  conflicts  were resolved correctly.
  959. Otherwise the parser may not behave as expected.
  960.  
  961. An example  of an  ambigious grammar  is the  following, specifying  a
  962. Pascal-like syntax of IF-THEN-ELSE statements:
  963.    %token IF THEN ELSE
  964.    %%
  965.    stmt      : IF expr THEN stmt                /* 1 */
  966.              | IF expr THEN stmt ELSE stmt      /* 2 */
  967.  
  968. The  ambiguity  in  this  grammar  fragment,  often referred to as the
  969. dangling-else-ambiguity, stems from the fact that it cannot be decided
  970. to which THEN a nested ELSE belongs: is
  971.    IF e1 THEN IF e2 THEN s1 ELSE s2
  972. to be interpreted as:
  973.    (1) IF e1 THEN ( IF e2 THEN s1 ELSE s2 )
  974. or as:
  975.    (2) IF e1 THEN ( IF e2 THEN s1 ) ELSE s2 ?
  976.  
  977. Let us take a look at how such an ambigious construct would be parsed.
  978. When the parser has seen IF e2 THEN s1, it could recognize (reduce by)
  979. the first rule,  yielding the second  interpretation; but it  could as
  980. well read ahead, shifting  the next symbol ELSE  on top of the  parser
  981. stack, then parse s2,  and finally reduce by  rule 2, which in  effect
  982. yields the first interpretation. Thus, upon seeing the token ELSE, the
  983. parser is in a shift/reduce  conflict: it cannot decide between  shift
  984. (the token ELSE) and reduce (by the first rule).
  985.  
  986. In the dangling-else example, the grammar - with some effort - can  be
  987. rewritten to eliminate the  ambiguity, see [1, section  4.3]. However,
  988. this is  not possible  in general  (there are  languages that  are in-
  989. trinsically ambigious). Furthermore, an unambigious grammar may  still
  990. be non-LALR (see  [1, exercise 4.40]  for an example).  In particular,
  991. parsing decisions in an LALR parser are based on one-symbol-lookahead,
  992. which limits the  class of grammars  that may be  used to construct  a
  993. `pure' LALR parser.
  994.  
  995. As implemented, Yacc always resolves shift/reduce conflicts in  favour
  996. of shift.  Thus a  Yacc generated  parser will  correctly resolve  the
  997. dangling-else  ambiguity  (assuming  the  common  rule,  that  an ELSE
  998. belongs to the last unmatched THEN).
  999.  
  1000. Another type of ambiguity arises when the parser has to choose between
  1001. two different rules. Consider the following grammar fragment (for sub-
  1002. and superscripted expressions in the UNIX equation formatter eqn):
  1003.    %token SUB SUP
  1004.    %%
  1005.    expr      : expr SUB expr SUP expr /* 1 */
  1006.              | expr SUB expr          /* 2 */
  1007.              | expr SUP expr          /* 3 */
  1008.  
  1009. The rationale behind this example is that an expression involving both
  1010. sub- and  superscript is  often set  differently from  a superscripted
  1011. subscripted expression.
  1012.  
  1013. The ambiguity arises in an expression of the form e1 SUB e2 SUP e3. At
  1014. the end of the  expression, the parser can  apply both rule 1  (reduce
  1015. the whole expression) and rule 3 (reduce the subexpression e2 SUP e3).
  1016.  
  1017. This type of conflict is termed reduce/reduce conflict. Yacc  resolves
  1018. reduce/reduce conflicts in favour of the rule listed first in the Yacc
  1019. grammar. Thus,  "special case  constructs" like  the one  above may be
  1020. specified by listing them ahead of the more general rules. In our  ex-
  1021. ample, e1 SUB e2  SUP e3 is always  interpreted as an instance  of the
  1022. first rule (which presumably is the intended result).
  1023.  
  1024. To summarize, in absence of other strategies (to be discussed  below),
  1025. Yacc applies the following default disambiguating rules:
  1026. - a shift/reduce conflict is resolved in favour of shift.
  1027. - in a  reduce/reduce conflict, the  first applicable grammar  rule is
  1028.   preferred.
  1029.  
  1030. In any case, the number of shift/reduce and reduce/reduce conflicts is
  1031. reported by  Yacc, since  they could  indicate inconsistencies  in the
  1032. grammar. Also, Yacc  reports rules that  are never reduced  (possibly,
  1033. because they are completely ruled out by disambiguating rules). A more
  1034. detailed description  of the  detected conflicts  may be  found in the
  1035. parser description (cf. 3.7).
  1036.  
  1037. The  default  disambiguating  rules  are  often inappropriate in cases
  1038. where an ambigious  grammar is deliberately  chosen as a  more concise
  1039. representation of  an (unambigious)  language. Consider  the following
  1040. grammar for arithmetic expressions:
  1041.    %token NUMBER
  1042.    %%
  1043.    expr      : expr '+' expr
  1044.              | expr '*' expr
  1045.              | NUMBER
  1046.              | '(' expr ')'
  1047.              ;
  1048.  
  1049. There  are  several  reasons  why  such  an ambigious grammar might be
  1050. preferred over the corresponding unambigious grammar:
  1051.    %token NUMBER
  1052.    %%
  1053.    expr      : term
  1054.              | expr '+' term
  1055.              ;
  1056.    term      : factor
  1057.              | term '*' factor
  1058.              ;
  1059.    factor    : NUMBER
  1060.              | '(' expr ')'
  1061.              ;
  1062.  
  1063. In particular, the ambigious grammar is more concise and natural,  and
  1064. yields a more efficient parser [1, section 4.8].
  1065.  
  1066. The ambiguities  in the  first grammar  may be  resolved by specifying
  1067. precedences and associativity of  the involved operator symbols.  This
  1068. may be done by means of the following precedence definitions:
  1069. - %left operator symbols: specifies left-associative operators
  1070. - %right  operator  symbols:   specifies  right-associative  operators
  1071.   (e.g., exponentiation)
  1072. - %nonassoc operator symbols: specifies non-associative operators (two
  1073.   operators of the  same class may  not be combined;  e.g., relational
  1074.   operators in Pascal)
  1075.  
  1076. Each operator symbol  may be a  literal or a  token-identifier; token-
  1077. names  appearing  in  precedence  definitions  may,  but  need  not be
  1078. declared with %token as well.
  1079.  
  1080. Each precedence declaration introduces a new precedence level,  lowest
  1081. precedence first. For  the example above,  assuming '+' and  '*' to be
  1082. left-associative, and '*' to take precedence over '+', the correspond-
  1083. ing Yacc grammar is:
  1084.    %token NUMBER
  1085.    %left '+'
  1086.    %left '*'
  1087.    %%
  1088.    expr      : expr '+' expr
  1089.              | expr '*' expr
  1090.              | NUMBER
  1091.              | '(' expr ')'
  1092.              ;
  1093.  
  1094. This grammar unambigiously specifies how arbitrary expressions are  to
  1095. be parsed; e.g., e1+e2+e3 will  be parsed as (e1+e2)+e3, and  e1+e2*e3
  1096. as e1+(e2*e3).
  1097.  
  1098. Yacc  resolves  shift/reduce  conflicts  using  precedences  and   as-
  1099. sociativity in the  following manner. With  each grammar rule,  it as-
  1100. sociates the precedence of the righmost terminal symbol (this  default
  1101. may be overwritten using a %prec tag, see below). Now, when there is a
  1102. conflict between shift a  and reduce r, a  a terminal and r  a grammar
  1103. rule, and  both a  and r  have associated  precedences p(a)  and p(r),
  1104. respectively, the conflict is resolved as follows:
  1105. - if p(a)>p(r), choose `shift'.
  1106. - if p(a)<p(r), choose `reduce'.
  1107. - if p(a)=p(r), the associativity of a determines the resolution:
  1108.   - if a is left-associative: `reduce'.
  1109.   - if a is right-associative: `shift'.
  1110.   - if a is non-associative: `syntax error'.
  1111.  
  1112. Shift/reduce conflicts resolved with  precedence will, of course,  not
  1113. be reported by Yacc.
  1114.  
  1115. Occasionally, it may be necessary to explicitly assign a precedence to
  1116. a rule using  a %prec tag,  because the default  choice (precedence of
  1117. rightmost terminal) is  inappropriate. Consider the  following example
  1118. in which '-' is used both as binary and unary minus:
  1119.    %token NUMBER
  1120.    %left '+' '-'
  1121.    %left '*' '/'
  1122.    %right UMINUS
  1123.    %%
  1124.    expr      : expr '+' expr
  1125.              | expr '-' expr
  1126.              | expr '*' expr
  1127.              | expr '/' expr
  1128.              | NUMBER
  1129.              | '(' expr ')'
  1130.              | '-' expr          %prec UMINUS
  1131.              ;
  1132.  
  1133. UMINUS is not an actual input symbol, but serves to give unary minus a
  1134. higher precedence than any other operator. Note that, by default,  the
  1135. last rule would otherwise have the precedence of (binary) '-'.
  1136.  
  1137. 3.5 ERROR HANDLING
  1138.  
  1139. This section is concerned with the built-in features Yacc provides for
  1140. syntactic error handling. By default, when a Yacc-generated parser en-
  1141. counters an  errorneous input  symbol, it  will print  out the  string
  1142. syntax error via the yymsg  routine and return to the  calling program
  1143. with the value 1. Usually, an application program will have to do bet-
  1144. ter than this, e.g. print appropriate error messages, and resume pars-
  1145. ing after syntax  errors. For this  purpose, Yacc supplies  a flexible
  1146. error recovery scheme  based on the  notion of "error  rules", cf. [1,
  1147. section 4.8 and 4.9].
  1148.  
  1149. The predefined token error is  reserved for error handling; it  is in-
  1150. serted at  places were  syntax errors  are expected,  yielding the so-
  1151. called error  rules. A  transition on  the error  token is never taken
  1152. during a normal parse,  but only when a  syntax error occurs. In  this
  1153. case the parser pretends it has seen an error token immediately before
  1154. the offending input symbol. Since in general the current state of  the
  1155. parser may not admit a transition on this fictitious error symbol, the
  1156. parser pops its stack until it finds a suitable state, which admits  a
  1157. transition on the  error token. If  no such state  exists, the default
  1158. error handler is used which prints out syntax error and terminates the
  1159. parse. If there is such a state, the parser shifts the error token  on
  1160. top of the stack, and resumes parsing.
  1161.  
  1162. To prevent cascades of error  messages, the parser then proceeds  in a
  1163. special  "error"  state  in  which  other errorneous input symbols are
  1164. quietly ignored. Normal parse is resumed only after three symbols have
  1165. been read and accepted by the parser.
  1166.  
  1167. As a simple example, consider the rule
  1168.    stmt  : error { action }
  1169. and assume a syntax error occurs while a statement is parsed. Then the
  1170. parser will pop its  stack, until the token  error, as an instance  of
  1171. the rule stmt : error, can  be accepted, shift the error token  on top
  1172. of the stack, reduce by the error rule immediately (executing action),
  1173. and resume parsing in error state. The effect is, that the parser  as-
  1174. sumes that a  statement (to which  error reduces) has  been found, and
  1175. skips symbols  until it  finds something  which can  legally follow  a
  1176. statement.
  1177.  
  1178. Similarly, the rule
  1179.    stmt  : error ';' { action }
  1180. will  cause  the  parser  to  skip  input symbols until a semicolon is
  1181. found, after which the parser  reduces by the error rule  and executes
  1182. action.
  1183.  
  1184. Note that error rules are not restricted to the simple forms indicated
  1185. above, but  may consist  of an  arbitrary number  of terminal and non-
  1186. terminal symbols.
  1187.  
  1188. Occasionally, the three-symbols resynchronization rule is  inadequate.
  1189. Consider, for example, an interactive application with an error rule
  1190.    input     : error '\n'   { write('reenter last line: ') }
  1191.                input        { $$ := $4 }
  1192.              ;
  1193.  
  1194. An error in an input line will then cause the parser to skip ahead be-
  1195. hind the following line end, emit the message reenter last line:,  and
  1196. read another line.  However, it will  quietly skip invalid  symbols on
  1197. the new line, until three valid  symbols have been found. This can  be
  1198. fixed by a call to the routine yyerrok which resets the parser to  its
  1199. normal mode of operation:
  1200.    input     : error '\n'   { write('reenter last line: ');
  1201.                               yyerrok }
  1202.                input        { $$ := $4 }
  1203.              ;
  1204.  
  1205. There are a number of other Yacc-supplied routines which are useful in
  1206. implementing better error diagnostics and handling:
  1207. - yychar: an integer variable containing the current lookahead token.
  1208. - yyclearin: deletes the current lookahead token.
  1209. - yynerrs: current total number of errors reported with yymsg.
  1210. - yyerror:  simulates  a  syntax  error;  syntactic error recovery is
  1211.   started, as if the next symbol was illegal.
  1212. - yyaccept: simulates accept action of the parser (yyparse returns 0).
  1213. - yyabort:  aborts  the  parse  (yyparse  returns  1),  as  if an un-
  1214.   recoverable syntax error occurred.
  1215.  
  1216. These, and other routines are  also described in the interface  of the
  1217. Yacc library (cf. 3.3).
  1218.  
  1219. Syntactic error handling and recovery is a difficult area; see [1] for
  1220. a more  comprehensive treatment  of this  topic. The  reader may  also
  1221. refer  to  [4]  for  a  more  detailed  explanation  of the Yacc error
  1222. recovery  mechanism  and  systematic  techniques  for developing error
  1223. rules.
  1224.  
  1225. 3.6 ARBITRARY VALUE TYPES
  1226.  
  1227. As already noted, the default type for the $$ and $i values is integer
  1228. (cf. 3.1). This type can be changed by putting a declaration
  1229.    %{
  1230.    type YYSTYPE = some_type;
  1231.    %}
  1232. into the definitions section of  the Yacc program, prior to  inclusion
  1233. of the header and lexical analyzer file.
  1234.  
  1235. Yacc also supports explicit declaration  of a (record) value type,  by
  1236. means of a definition
  1237.    %union{
  1238.       name(s) : type;
  1239.       ...
  1240.       }
  1241.  
  1242. Such a definition will be translated to a corresponding (Turbo Pascal)
  1243. record declaration which is put  into the header file, and  determines
  1244. the type of stacked $$ values, as well as of the yylval variable  (cf.
  1245. 3.2). "Union tags"  of the form  <name>, where name  is the name  of a
  1246. component of  the record  type, can  then be  assigned to terminal and
  1247. nonterminal symbols through %token and %type definitions,  respective-
  1248. ly.
  1249.  
  1250. Consider, for example, the definition:
  1251.    %union{
  1252.           integer_val : integer;
  1253.           real_val : real;
  1254.          }
  1255. and the grammar rules:
  1256.    %token INT
  1257.    %%
  1258.    expr      : expr '+' expr     { $$ := $1 + $3 }
  1259.              | expr '*' expr     { $$ := $1 * $3 }
  1260.              | INT               { $$ := $1 }
  1261.              /* ... */
  1262.  
  1263. To assign value type real to nonterminal expr, and type integer to the
  1264. token INT, one might say:
  1265.    %token <integer_val> INT
  1266.    %type <real_val> expr
  1267.  
  1268. The effect is, that Yacc  will automatically replace references to  $$
  1269. and $i values by the appropriate record tags, i.e. $$ := $1 + $3  will
  1270. be treated as $$.real_val := $1.real_val + $3.real_val, and the action
  1271. $$  :=  $1  associated  with  the  third  rule  will be interpreted as
  1272. $$.real_val := $1.integer_val.
  1273.  
  1274. Also, when arbitrary  value types are  used, Yacc checks  whether each
  1275. value referred to by an action has a well-defined type.
  1276.  
  1277. Occasionally, there  are values  whose types  cannot be  determined by
  1278. Yacc easily. This is the case for  the $$ value of an action within  a
  1279. rule, as well as  for values $i, i<=0  of symbols in enclosing  rules.
  1280. For such values the notations <name> and <name>i must be used, respec-
  1281. tively, where <name> denotes the appropriate union tag.
  1282.  
  1283. The expr grammar on the distribution disk is a `real-life' example  of
  1284. the use of arbitrary value types.
  1285.  
  1286. 3.7 DEBUGGING
  1287.  
  1288. As  experience  shows,  debugging  a  parser  can  be  quite  tedious.
  1289. Although, with some experience, writing a grammar is a quite easy  and
  1290. straightforward  task,  implementing,  for  instance,  a  good   error
  1291. recovery scheme may be quite tricky. Yacc supplies two debugging  aids
  1292. that help verify a parser.
  1293.  
  1294. First  of  all,  the  parser  description  (.lst  file) is useful when
  1295. determining  whether  Yacc  correctly  resolved parsing conflicts, and
  1296. when tracing the actions of a  parser. The .lst file gives a  descrip-
  1297. tion of all generated parser states. For each state, the set of kernel
  1298. items and the parse actions are given. The kernel items correspond  to
  1299. the grammar rules processed  by the parser in  a given state; the  un-
  1300. derscore _ in an item denotes the prefix of the rule that has  already
  1301. been seen, and the suffix yet to come. The parser actions specify what
  1302. action the parser takes  on a given input  symbol. Here, the period  .
  1303. denotes the default action that is taken on any input symbol not  men-
  1304. tioned otherwise. Possible actions are:
  1305. - shift an  input symbol on  top of the  parser stack, and  change the
  1306.   parser state accordingly;
  1307. - goto a new state  upon a certain nonterminal recognized  through the
  1308.   previous reduction;
  1309. - reduce by a certain grammar rule;
  1310. - accept, i.e. successfully terminate the parse; and
  1311. - error, start syntax error recovery.
  1312. The default action in a state may either be reduce or error.
  1313.  
  1314. The parser description also lists parsing conflicts and rules that are
  1315. never reduced (cf. 3.4).
  1316.  
  1317. Consider the ambigious grammar:
  1318.    %token NUMBER
  1319.    %%
  1320.    expr      : expr '+' expr
  1321.              | expr '*' expr
  1322.              | NUMBER
  1323.              ;
  1324.  
  1325. This grammar, when fed into  Yacc will cause a number  of shift/reduce
  1326. conflicts. For instance, the description of parser state 5 in the .lst
  1327. file will read as follows:
  1328.    state 5:
  1329.            shift/reduce conflict (shift 3, reduce 2) on '*'
  1330.            shift/reduce conflict (shift 4, reduce 2) on '+'
  1331.  
  1332.            expr : expr '*' expr _  (2)
  1333.            expr : expr _ '+' expr
  1334.            expr : expr _ '*' expr
  1335.  
  1336.            $end    reduce 2
  1337.            '*'     shift 3
  1338.            '+'     shift 4
  1339.            .       error
  1340.  
  1341. As is  apparent from  this description,  the conflicts  are caused  by
  1342. missing precedences and associativities of  '+' and '*'. Also, it  can
  1343. be seen  that for  both '+'  and '*'  Yacc chose  shift, following the
  1344. default shift/reduce disambiguating rule.
  1345.  
  1346. Now let us resolve the conflicts in the grammar by adding  appropriate
  1347. precedence declarations:
  1348.    %token NUMBER
  1349.    %left '+'
  1350.    %left '*'
  1351.    %%
  1352.    expr      : expr '+' expr
  1353.              | expr '*' expr
  1354.              | NUMBER
  1355.              ;
  1356.  
  1357. Now, all conflicts are resolved and for the description of state 5  we
  1358. get:
  1359.    state 5:
  1360.  
  1361.            expr : expr '*' expr _  (2)
  1362.            expr : expr _ '+' expr
  1363.            expr : expr _ '*' expr
  1364.  
  1365.            .       reduce 2
  1366.  
  1367. Thus, Yacc correctly resolved the ambiguities by chosing reduction  on
  1368. any  input,  which  corresponds  to  the  higher  precedence and left-
  1369. associativity of '*'.
  1370.  
  1371. There are situations in which a parser seems to behave "strangely"  in
  1372. spite of  an "obviously  correct" grammar.  If the  problem cannot  be
  1373. found by careful analysis  of the grammar, it  is useful to trace  the
  1374. actions performed by the parser, to get an idea of what goes wrong.
  1375.  
  1376. For this  purpose a  parser may  be compiled  with defined conditional
  1377. yydebug, e.g.:
  1378.    yacc parser
  1379.    tpc parser /Dyydebug
  1380.  
  1381. When run, the parser  will print out the  actions it performs in  each
  1382. step (together with parser states, numbers of shifted symbols,  etc.),
  1383. which can then be followed on a hardcopy of the parser description.
  1384.  
  1385. Debug messages are printed via  the yydebugmsg routine (cf. 3.3).  You
  1386. may also wish to tailor this routine to your target application,  such
  1387. that it prints more informative messages.
  1388.  
  1389. Of course, the  discussion above was  rather sketchy. A  more detailed
  1390. treatment of these  topics, however, would  require a presentation  of
  1391. the LALR  parsing technique,  which is  well beyond  the scope of this
  1392. manual. The reader  instead is referred  to [1, sections  4.7 and 4.8]
  1393. for more information about the LALR technique. Also, [4] gives a  more
  1394. detailed explanation of (UNIX)  Yacc parse tables and  debug messages,
  1395. which can mostly be applied to Turbo Pascal Yacc accordingly.
  1396.  
  1397. 3.8 YACC LANGUAGE GRAMMAR
  1398.  
  1399. This section specifies  the Yacc language  syntax, as a  Yacc grammar.
  1400. Actually, the Yacc  language is more  naturally expressed by  an LR(2)
  1401. grammar;  the  difficulty  is  to  decide  on  the  base of one-symbol
  1402. lookahead whether an identifier at the end of a rule is followed by  a
  1403. colon, in which case it starts the next rule. Thus, we distinguish the
  1404. token  C_ID  (an  identifier  followed  by  a  colon)  and  "ordinary"
  1405. identifiers ID. It is assumed to  be the task of the lexical  analysis
  1406. to determine to which of these two classes an identifier belongs.
  1407.  
  1408. The following grammar has been  abstracted from the Turbo Pascal  Yacc
  1409. grammar actually used to implement Turbo Pascal Yacc.
  1410.  
  1411. %token
  1412.   ID           /* identifier; also literals enclosed in quotes */
  1413.   C_ID         /* identifier followed by a colon */
  1414.   NUMBER       /* nonnegative integers */
  1415.   TOKEN LEFT RIGHT NONASSOC TYPE START UNION PREC
  1416.                /* reserved words: %token, etc. */
  1417.   SEP          /* separator %% */
  1418.   LCURL RCURL  /* curly braces %{ and %} */
  1419.   ',' ':' ';' '|' '{' '}' '<' '>'
  1420.                /* single character literals */
  1421.  
  1422. %start spec
  1423.  
  1424. %%
  1425.  
  1426. spec           : defs SEP rules aux_procs
  1427.                ;
  1428.  
  1429. /* auxiliary procedures section: *************************/
  1430.  
  1431. aux_procs      : /* empty: aux_procs is optional */
  1432.                | SEP { copy the rest of the file }
  1433.                ;
  1434. /* definitions section: **********************************/
  1435.  
  1436. defs           : /* empty */
  1437.                | defs def
  1438.                ;
  1439.  
  1440. def            : START ID
  1441.                | UNION '{' { copy the union definition } '}'
  1442.                | LCURL { copy Turbo Pascal tie-in } RCURL
  1443.                | TOKEN tag token_list
  1444.                | LEFT tag token_list
  1445.                | RIGHT tag token_list
  1446.                | NONASSOC tag token_list
  1447.                | TYPE tag nonterm_list
  1448.                ;
  1449.  
  1450. tag            : /* empty: union tag is optional */
  1451.                | '<' ID '>'
  1452.                ;
  1453.  
  1454. token_list     : token_num
  1455.                | token_list token_num
  1456.                | token_list ',' token_num
  1457.                ;
  1458.  
  1459. token_num      : ID
  1460.                | ID NUMBER
  1461.                ;
  1462.  
  1463. nonterm_list   : nonterm
  1464.                | nonterm_list nonterm
  1465.                | nonterm_list ',' nonterm
  1466.                ;
  1467.  
  1468. nonterm        : ID
  1469.                ;
  1470.  
  1471. /* rules section: ****************************************/
  1472.  
  1473. rules          : rule1
  1474.                | LCURL { copy Turbo Pascal tie-in } RCURL rule1
  1475.                | rules rule
  1476.                ;
  1477.  
  1478. rule1          : C_ID ':' body preced
  1479.                ;
  1480.  
  1481. rule           : rule1
  1482.                | '|' body preced
  1483.                ;
  1484.  
  1485. body           : /* empty */
  1486.                | body ID
  1487.                | body action
  1488.                ;
  1489.  
  1490. action         : '{' { copy action, substitute $$, etc. } '}'
  1491.                ;
  1492.  
  1493. preced         : /* empty */
  1494.                | PREC ID
  1495.                | PREC ID action
  1496.                | preced ';'
  1497.                ;
  1498.  
  1499. 3.9 ADDITIONAL FEATURES, IMPLEMENTATION RESTRICTIONS AND BUGS
  1500.  
  1501. For backward compatibility, Turbo Pascal Yacc supports all  additional
  1502. language  elements  entitled  as  `Old  Features Supported But not En-
  1503. couraged' in the UNIX manual:
  1504. - literals delimited by double quotes and multiple-character literals.
  1505. - \ as a synonym for %, i.e. \\ is %%, \left is %left, etc.
  1506. - other synonyms: %< = %left,  %> = %right, %binary = %2  = %nonassoc,
  1507.   %term = %0 = %token, %= = %prec.
  1508. - actions of the form ={...} and =single statement;.
  1509. - host language tie-ins (%{...%})  at the beginning of the  rules sec-
  1510.   tion (I think that this last one is really a must).
  1511.  
  1512. See the UNIX Yacc manual for further information.
  1513.  
  1514. As with Lex, Yacc poses some restrictions on internal table sizes  for
  1515. the source grammar and the  constructed parser; these are printed  out
  1516. by Yacc  together with  statistics about  actual table  space require-
  1517. ments, after a  successful translation of  a grammar. Also,  make sure
  1518. that enough main memory is available.
  1519.  
  1520. The default  size of  the parser  stack is  yymaxdepth=1024 (cf.  3.3)
  1521. which should be sufficient for  any average application, but may  also
  1522. be enlarged (and shrinked) as needed. Note that right-recursive  gram-
  1523. mar rules  may increase  stack space  requirements; thus  it is a good
  1524. idea to use left-recursive (and left-associative) rules wherever  pos-
  1525. sible.
  1526.  
  1527. Standard  (UNIX)  Yacc  has  a  bug  that  causes some (correct) error
  1528. recovery schemes to hang in an endless loop, see [4]. This bug  should
  1529. be fixed in  the Turbo  Pascal implementation, at the cost of slightly
  1530. increased parse table sizes.
  1531.  
  1532. Yes, there is  (at least) one  bug in Turbo  Pascal Yacc, namely  that
  1533. %union definitions (cf.  3.6) are translated  to simple Pascal  record
  1534. types. They should be variant  records instead. This will be  fixed in
  1535. the next release, if  there ever is one.  Note that this bug  does not
  1536. affect  the  proper  functioning  of  the  parser; it merely increases
  1537. memory requirements for the parser's value stack. Anyhow, you may work
  1538. around this by using %union definitions of the (Pascal variant record)
  1539. form
  1540.    %union { case integer of
  1541.             1: ( ... ) ;
  1542.             2: ( ... ) ;
  1543.              ...
  1544.           }
  1545.  
  1546. A final remark  about the efficiency  of Yacc-generated parsers  is in
  1547. order. The time needed to parse  an input of length n is  proportional
  1548. to n.  Although this  may not  convince everyone  (Lex makes a similar
  1549. claim, however most Lex-based analyzers seem to be considerably slower
  1550. than hand-crafted ones), my experience is that Yacc-generated  parsers
  1551. are in  fact fast,  at least  efficient enough  for most  applications
  1552. (such as Turbo Pascal Yacc itself). The major bottleneck for  compila-
  1553. tion speed almost never seems to be the parser, but almost always  the
  1554. lexical analyzer, see [5, section 6.2]. Furthermore, one always has to
  1555. consider that manual  implementation of parsers  is usually much  more
  1556. costly, compared to the use of a parser generator.
  1557.  
  1558. Personally, I  prefer a  parser generator,  because I'm  really a lazy
  1559. programmer; and if something seems not to be running at optimal speed,
  1560. so what?  We can  always sit  back and  wait for  still more efficient
  1561. hardware to come (just kidding).
  1562.  
  1563. CONCLUSION
  1564.  
  1565. The Turbo Pascal Lex and  Yacc versions described in this  manual have
  1566. been designed and tested carefully. I have used them myself to  imple-
  1567. ment, among other applications: a lexical analyzer and parser for Pas-
  1568. cal (using a public domain ISO  Level 0 grammar, also included in  the
  1569. distribution); Turbo  Pascal Yacc  itself, using  bootstrapping; and a
  1570. term rewriting system compiler.
  1571.  
  1572. Also, quite a lot of  smaller text and data processing  and conversion
  1573. routines have been implemented by the author, and others, using  these
  1574. programs.
  1575.  
  1576. Personally, I feel that these  tools are quite convenient and  useful,
  1577. and  can  safe  a  lot  of  trouble  and time in software development,
  1578. although they surely could still  be improved in one direction  or the
  1579. other.
  1580.  
  1581. Compiler  construction  tools  are  not  only  useful for the compiler
  1582. writer, but can also be applied in the development of almost any other
  1583. software tool that,  in some sense,  defines an input  language. Also,
  1584. the use of such  utilities facilitates rapid prototyping,  and enables
  1585. the programmer to  clarify language design  issues in early  stages of
  1586. software projects.
  1587.  
  1588. Turbo Pascal Lex  and Yacc, as  a starting point,  bring to the  Turbo
  1589. Pascal programmer some of the merits of theoretically founded compiler
  1590. technology, and  thus may  facilitate some  of his  work in  trying to
  1591. produce good, and reliable software.
  1592.  
  1593. Author's  address:  Albert  Graef,  FB Mathematik, Johannes Gutenberg-
  1594. Universitaet Mainz, 6500 Mainz (FRG). Email: Graef@DMZRZU71.bitnet.
  1595.  
  1596. REFERENCES
  1597.  
  1598. [1]   Aho, Alfred V.; Ravi Sethi; Jeffrey D. Ullman: Compilers : prin-
  1599.       ciples, techniques  and tools.  Reading, Mass.:  Addison-Wesley,
  1600.       1986.
  1601.  
  1602. [2]   Johnson,  S.C.: Yacc  - yet  another compiler-compiler.  Murray
  1603.       Hill, N.J.: Bell Telephone Laboratories, 1974. (CSTR-32).
  1604.  
  1605. [3]   Lesk, M.E.: Lex  - a lexical  analyser  generator. Murray  Hill,
  1606.       N.J.: Bell Telephone Laboratories, 1975. (CSTR-39).
  1607.  
  1608. [4]   Schreiner, A.T.; H.G.  Friedman:  Introduction to  compiler con-
  1609.       struction with UNIX. Prentice-Hall, 1985.
  1610.  
  1611. [5]   Waite,  William M.;  Gerhard Goos:   Compiler construction.  New
  1612.       York:  Springer,  1985.   (Texts  and  monographs   in  computer
  1613.       science).
  1614.  
  1615. APPENDIX: LEX AND YACC MANUAL PAGES
  1616.  
  1617. NAME
  1618.  
  1619. Lex - lexical analyzer generator (MS-DOS/Turbo Pascal version)
  1620.  
  1621. SYNOPSIS
  1622.  
  1623. lex lex-file-name[.l] [output-file-name[.pas]]
  1624.  
  1625. DESCRIPTION
  1626.  
  1627. Lex compiles the regular expression grammar contained in lex-file-name
  1628. (default suffix: .l) to the  Turbo Pascal representation of a  lexical
  1629. analyzer for the language described  by the input grammar, written  to
  1630. output-file-name (default  suffix: .pas;  default: lex-file-name  with
  1631. new suffix .pas).
  1632.  
  1633. For each pattern in the input grammar an action is given, which is  an
  1634. arbitrary Turbo  Pascal statement  to execute  when the  corresponding
  1635. pattern is matched in the input stream.
  1636.  
  1637. The lexical  analyzer is  implemented as  a table-driven deterministic
  1638. finite automaton (DFA) routine named yylex, declared as follows:
  1639.    function yylex : integer;
  1640.  
  1641. The return value  of yylex may  be 0, denoting  end-of-file; all other
  1642. return  values  are  defined  by  the  programmer  and set through ap-
  1643. propriate actions.
  1644.  
  1645. The yylex routine can be compiled with the Turbo Pascal compiler  (tpc
  1646. or turbo). It is  to be called in  the context of a  Turbo Pascal main
  1647. program using the LexLib unit (which can be a Yacc-generated parser or
  1648. any other program in a  separate file, or incorporated into  the input
  1649. specification, and is to be supplied by the programmer).
  1650.  
  1651. EXAMPLE
  1652.  
  1653. A simple Lex program that counts words in an input file (obtained from
  1654. standard input) can be implemented as follows:
  1655.         uses LexLib;
  1656.         var count : integer;
  1657.    %%
  1658.    [^ \t\n]+    inc(count);
  1659.    .            |
  1660.    \n           ;
  1661.    %%
  1662.    begin
  1663.      count := 0;
  1664.      if yylex=0 then writeln('word count: ', count)
  1665.    end.
  1666.  
  1667. To compile and run this program, issue the following commands  (assum-
  1668. ing the Lex program to be in file wordcount.l):
  1669.    lex wordcount
  1670.    tpc wordcount
  1671.    wordcount <input-file
  1672.  
  1673. DIAGNOSTICS
  1674.  
  1675. In  case  of  syntactic  or  semantic  errors  in the source file, Lex
  1676. displays  source  line numbers  and   contents,  error  position   and
  1677. error message; a  copy of the  error messages is  written to the  file
  1678. lex-file-name with new suffix .lst.
  1679.  
  1680. NAME
  1681.  
  1682. Yacc - yet another compiler-compiler (MS-DOS/Turbo Pascal version)
  1683.  
  1684. SYNOPSIS
  1685.  
  1686. yacc yacc-file-name[.y] [output-file-name[.pas]]
  1687.  
  1688. DESCRIPTION
  1689.  
  1690. Yacc  compiles  the  BNF-like  grammar  contained  in   yacc-file-name
  1691. (default suffix: .y) to the Turbo Pascal representation of an  LALR(1)
  1692. parser  for  the  specified  language,  written  to   output-file-name
  1693. (default suffix: .pas; default: yacc-file-name with new suffix .pas).
  1694.  
  1695. Also, it generates a header file (output file name with new suffix .h)
  1696. containing declarations to  be shared between  parser and the  lexical
  1697. analyzer routine  yylex (discussed  below), and  a report  file (yacc-
  1698. file-name with  new suffix  .lst) that  contains a  description of the
  1699. generated parser.
  1700.  
  1701. The grammar rules in the specification can be augmented with  actions,
  1702. Turbo Pascal statements to execute when an instance of the correspond-
  1703. ing grammar rule has been matched in the input.
  1704.  
  1705. The parser  is implemented  as a  table-driven deterministic pushdown-
  1706. automaton routine yyparse, that performs a non-backtracking, bottom-up
  1707. shift/reduce parse. yyparse is declared as follows:
  1708.    function yyparse : integer;
  1709.  
  1710. The return value of this  function is either 0 (normal  termination of
  1711. the parse) or 1 (exception occurred during the parse, e.g. stack over-
  1712. flow,  unrecoverable  syntax   error,  or  programmer   action  called
  1713. yyabort).
  1714.  
  1715. The yyparse  routine can  be compiled  with the  Turbo Pascal compiler
  1716. (tpc or turbo). It  is to be called  in the context of  a Turbo Pascal
  1717. main program using the YaccLib unit and a lexical analyzer routine
  1718.    function yylex : integer;
  1719. which can  also be  prepared with Lex;  these  must be supplied by the
  1720. programmer.  The header file Yacc generates summarizes declarations to
  1721. be shared between parser and the yylex routine.
  1722.  
  1723. If the yyparse routine  is compiled with defined  conditional yydebug,
  1724. i.e.
  1725.    tpc  filename /Dyydebug
  1726. yyparse will trace all parsing actions on standard output.
  1727.  
  1728. EXAMPLE
  1729.  
  1730. The sample desktop calculator  supplied on the distribution  disk con-
  1731. sists of the main program and input grammar in file expr.y and a lexi-
  1732. cal analyzer in the Lex source file exprlex.l. It can be compiled  and
  1733. run by issuing the commands:
  1734.    yacc expr
  1735.    lex exprlex
  1736.    tpc expr
  1737.    expr
  1738.  
  1739. To trace the steps made by the parser, compile expr.pas with
  1740.    tpc expr /Dyydebug
  1741.  
  1742. DIAGNOSTICS
  1743.  
  1744. When encountering syntactic  or semantic errors  in an input  grammar,
  1745. Yacc  gives  diagnostics  on  standard  output  and in the report file
  1746. (yacc-file-name with new suffix .lst).
  1747.  
  1748. Upon successful compilation of the input grammar, Yacc will report the
  1749. number of  shift/reduce and  reduce/reduce conflicts  encountered when
  1750. constructing the parser (if there are any); also, Yacc will report the
  1751. number of grammar rules that are never used in a reduction, and  issue
  1752. warnings when nonterminal  grammar symbols do  not appear on  the left
  1753. side  of  at  least  one  grammar  rule.  Such  items,  in particular:
  1754. shift/reduce and reduce/reduce conflicts, are discussed in more detail
  1755. in the report (.lst) file.
  1756.